אני מעוניין ליצור באנרים מתחלפים על סמך מסד נתונים.
הטבלה שלי נקראת banner ומכילה את הערכים הבאים:
name, picture, code, link, id
השימוש הוא בעיקרון בפונקציה rand אותה הרצתי על ה-id, אך הבעיה החלה כאשר מחקתי באנרים מהמסד נתונים ואז לא כל מספר הוא אכן ID פעיל נניח שהטבלה שלי הייתה נראת כך:
[code]
niv (name) niv.png (picture) null (code) http://www.phpuide.co.il (link) 1 (id)
niv (name) niv.png (picture) null (code) http://www.phpuide.co.il (link) 2 (id)
niv (name) niv.png (picture) null (code) http://www.phpuide.co.il (link) 3 (id)
[/code]
לאחר מחיקת באנר מספר id 2 הטבלה נראת כך:
[code]
niv (name) niv.png (picture) null (code) http://www.phpuide.co.il (link) 1 (id)
niv (name) niv.png (picture) null (code) http://www.phpuide.co.il (link) 3 (id)
[/code]
כלומר בהנחה ויוצא לי rand = 2 אין ערך כזה. ניסיתי לפתור את זה באמצעות הקוד הבא, אך הבעיה שמדי פעם הוא מחזיר לי null, מדוע?
[code]
$query = mysql_query("select * from banner");
$array = array();
while($row = mysql_fetch_array($query))
{
$array[] = $row['id'];
}
$narray = count($array);
$rand = rand($array[0],$narray);
$id = $array[$rand];
$new_query = mysql_query("select * from banner where `id`='{$id}'");
$new_row = mysql_fetch_array($new_query);
exit( var_dump($id));
[/code]
5 תשובות
אז כנראה ש-PHP לא בריאה בשעות הלילה, הפתרון הוא שCOUNT מתחיל לספור מ-1 ואילו המערך מתחיל מ-0
בכל אופן, האם הדרך הזו יעילה מבחינת בזבוז משאבים? תודה רבה
במקום לחפש פתרון ב-PHP, תחפש פתרון ב-SQL:
ORDER BY RAND()
LIMIT 1
מאחר ולא מדובר בטבלה גדולה אין בעיה לבצע זאת כך אך כן מומלץ להכיר את מה שאלכס ציין,בטבלאות עמוסות יותר ORDER BY RAND() עובד לאט.
שיטה נחמדה שיצא לי לראות בעבר - http://www.rndblog.com/how-to-select-random-rows-in-mysql
החסרון הוא שלא תמיד יצא לך מספר התוצאות שציפית.למשל רצית 5 אז פעם ב 10 הרצות בערך יצא לך 3-4 תוצאות בד"כ,כמובן שתמיד יכול להיות לך 0 אך זה בד"כ לא קורא.
ניתן כמובן לשפר את החישוב טיפה ככה שיצא סיכוי גבוה יותר ובנוסף להוסיף calllback במידה ונשלפו פחות מ 5 אז שישלוף ערך מסוים [למשל מספר השורות חלקי 2 וה id גדול ממה שקיבלת ובנוסף ה id לא שווה לשורות שכבר התקבלו מקודם]